package com.king.freefish.common.util;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import com.king.freefish.common.exception.ValidateCodeException;
import lombok.experimental.UtilityClass;
import org.springframework.lang.Nullable;

import java.util.Collection;
import java.util.Map;

/**
 * @packageName com.king.freefish.online.common.util
 * @author: jinguoguang
 * @date: 2025/7/29 15:01
 * @description:
 **/
@UtilityClass
public class Assert {

    /**
     * 断言表达式为true
     *
     * @param expression 表达式
     * @param msg        提示信息
     */
    public static void isTrue(boolean expression, String msg) {
        //取反校验
        if (!expression) {
            throw new ValidateCodeException(msg);
        }
    }

    /**
     * 断言表达式为false
     *
     * @param expression 表达式
     * @param msg        提示信息
     */
    public static void isFalse(boolean expression, String msg) {
        //为真处理
        if (expression) {
            throw new ValidateCodeException(msg);
        }
    }

    /**
     * 断言目标为null
     *
     * @param target 目标对象
     * @param msg    提示信息
     */
    public static void isNull(@Nullable Object target, String msg) {
        //非空校验
        if (ObjUtil.isNotNull(target)) {
            throw new ValidateCodeException(msg);
        }
    }

    /**
     * 断言目标非空
     *
     * @param target 目标对象
     * @param msg    提示信息
     */
    public static void notNull(@Nullable Object target, String msg) {
        //非空校验
        if (ObjUtil.isNull(target)) {
            throw new ValidateCodeException(msg);
        }
    }

    /**
     * 断言字符串为空
     *
     * @param str 字符串
     * @param msg 提示信息
     */
    public static void blank(@Nullable String str, String msg) {
        //字符串校验
        if (StrUtil.isNotBlank(str)) {
            throw new ValidateCodeException(msg);
        }
    }

    /**
     * 断言字符串非空
     *
     * @param str 字符串
     * @param msg 提示信息
     */
    public static void notBlank(@Nullable String str, String msg) {
        //字符串校验
        if (StrUtil.isBlank(str)) {
            throw new ValidateCodeException(msg);
        }
    }

    /**
     * 断言字符串包含目标字符串
     *
     * @param str    字符串
     * @param target 目标字符串
     * @param msg    提示信息
     */
    public static void contains(@Nullable String str, String target, String msg) {
        //包含校验
        if (!StrUtil.contains(str, target)) {
            throw new ValidateCodeException(msg);
        }
    }

    /**
     * 断言字符串不包含目标字符串
     *
     * @param str    字符串
     * @param target 目标字符串
     * @param msg    提示信息
     */
    public static void doesNotContain(@Nullable String str, String target, String msg) {
        //包含校验
        if (StrUtil.contains(str, target)) {
            throw new ValidateCodeException(msg);
        }
    }

    /**
     * 断言集合为空
     *
     * @param coll 集合
     * @param msg  提示信息
     */
    public static void isEmpty(@Nullable Collection<?> coll, String msg) {
        //非空校验
        if (CollUtil.isNotEmpty(coll)) {
            throw new ValidateCodeException(msg);
        }
    }

    /**
     * 断言集合不为空
     *
     * @param coll 集合
     * @param msg  提示信息
     */
    public static void notEmpty(@Nullable Collection<?> coll, String msg) {
        //非空校验
        if (CollUtil.isEmpty(coll)) {
            throw new ValidateCodeException(msg);
        }
    }

    /**
     * 断言map集合为空
     *
     * @param map map集合
     * @param msg 提示信息
     */
    public static void isEmpty(@Nullable Map<?, ?> map, String msg) {
        //非空校验
        if (CollUtil.isNotEmpty(map)) {
            throw new ValidateCodeException(msg);
        }
    }

    /**
     * 断言map集合不为空
     *
     * @param map map集合
     * @param msg 提示信息
     */
    public static void notEmpty(@Nullable Map<?, ?> map, String msg) {
        //非空校验
        if (CollUtil.isEmpty(map)) {
            throw new ValidateCodeException(msg);
        }
    }

    /**
     * 断言数组为空
     *
     * @param array 数组
     * @param msg   提示信息
     * @param <T>   泛型
     */
    public static <T> void isEmpty(@Nullable T[] array, String msg) {
        //非空校验
        if (ArrayUtil.isNotEmpty(array)) {
            throw new ValidateCodeException(msg);
        }
    }

    /**
     * 断言数组不为空
     *
     * @param array 数组
     * @param msg   提示信息
     * @param <T>   泛型
     */
    public static <T> void notEmpty(@Nullable T[] array, String msg) {
        //非空校验
        if (ArrayUtil.isEmpty(array)) {
            throw new ValidateCodeException(msg);
        }
    }

    /**
     * 断言数组不为空且不存在空元素
     *
     * @param array 数组
     * @param msg   提示信息
     */
    public static void noNullElements(@Nullable Object[] array, String msg) {
        //非空校验
        if (ArrayUtil.hasEmpty(array)) {
            throw new ValidateCodeException(msg);
        }
    }

    /**
     * 断言数字大于 0
     *
     * @param number 数字
     * @param msg    提示信息
     */
    public static void greaterThanZero(Integer number, String msg) {
        //非空及小于等于0校验
        if (ObjUtil.isNull(number) || number <= 0) {
            throw new ValidateCodeException(msg);
        }
    }

    /**
     * 断言数字大于 0
     *
     * @param number 数字
     * @param msg    提示信息
     */
    public static void greaterThanZero(Long number, String msg) {
        //非空及小于等于0校验
        if (ObjUtil.isNull(number) || number <= 0L) {
            throw new ValidateCodeException(msg);
        }
    }

    /**
     * 断言数字大等于 0
     *
     * @param number 数字
     * @param msg    提示信息
     */
    public static void greaterOrEqualZero(Integer number, String msg) {
        //非空及小于等于0校验
        if (ObjUtil.isNull(number) || number < 0) {
            throw new ValidateCodeException(msg);
        }
    }

    /**
     * 断言数字大于等于 0
     *
     * @param number 数字
     * @param msg    提示信息
     */
    public static void greaterOrEqualZero(Long number, String msg) {
        //非空及小于等于0校验
        if (ObjUtil.isNull(number) || number < 0L) {
            throw new ValidateCodeException(msg);
        }
    }

    /**
     * 断言数字等于 0
     *
     * @param number 数字
     * @param msg    提示信息
     */
    public static void equalToZero(Integer number, String msg) {
        //非空及小于等于0校验
        if (ObjUtil.isNull(number) || number != 0) {
            throw new ValidateCodeException(msg);
        }
    }

    /**
     * 断言数字等于 0
     *
     * @param number 数字
     * @param msg    提示信息
     */
    public static void equalToZero(Long number, String msg) {
        //非空及小于等于0校验
        if (ObjUtil.isNull(number) || number != 0L) {
            throw new ValidateCodeException(msg);
        }
    }

}